﻿using System;
using System.Collections.Generic;
using System.Linq;
using DevExpress.Data.PLinq.Helpers;
using Zero.Core.Domain;
using Zero.Core.Domain.Query;
using Zero.POCO.Donnees;
using Zero.POCO.FiltreEnumeration;
using Zero.POCO.Interfaces;

namespace Zero.POCO.Compagne
{
    public class Compaign : EntityBase<Guid>,IAggregateRoot
    {
        static List<int> _premier = new List<int>() { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,101,103,107,109,113,127 };
        public Marque Marque { get; set; }
        public Annonceur Annonceur { get; set; }
        public TypeCompaign TypeCompaign{ get; set; }
        public List<PlanTV> PlanTvs { get; set; }
        public List<PlanRadio> PlanRadios { get; set; }
        public List<PlanPresse> PlanPresses { get; set; }
        public Filter Filtre { get; set; }
        public Vague Vague { get; set; }
        public List<ISignalitique> Signalitiques { get; set; }
        public DateTime DateDebut { get; set; }
        public DateTime DateFin { get; set; }
        public String Name { get; set; }
        protected override void Validate()
        {
            throw new NotImplementedException();
        }





        public int GetFiltrePrimaire()
        {

            int value = 1;
            if (this.Filtre == null) return 1;
            List<ISignalitique> sigElu = this.Vague.Signalitique;

            /***************CSE*************************/
            /*if (Filtre.CSEs.Any())
            {
                List<int> listeCse = Filtre.CSEs.Select(Cse => (int) Cse).ToList();
                sigElu = sigElu.Where(e => listeCse.Contains((int)e.CSE)).ToList();
            }*/


            var Class_a = FiltreFactory.DesassembleFiltre(Filtre.CSEs, _premier[0]);
            if (Class_a)
                value = value * _premier[19];

            var Class_b = FiltreFactory.DesassembleFiltre(Filtre.CSEs, _premier[1]);
            if (Class_b)
                value = value * _premier[20];

            var Class_c = FiltreFactory.DesassembleFiltre(Filtre.CSEs, _premier[2]);
            if (Class_c)
                value = value * _premier[21];

            var Class_d = FiltreFactory.DesassembleFiltre(Filtre.CSEs, _premier[3]);
            if (Class_d)
                value = value * _premier[22];


            /***************CSP*************************/
            /*
            if (Filtre.CSPs.Any())
            {
                var listeCsp = Filtre.CSPs.Select(Csp => (int) Csp).ToList();
                sigElu = sigElu.Where(e => listeCsp.Contains((int)e.CSP)).ToList();
            }*/


            var HautFonc = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[0]);
            if (HautFonc)
                value = value * _premier[8];

            var ProfLibe = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[1]);
            if (ProfLibe)
                value = value * _premier[12];

            var Cadre = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[2]);
            if (Cadre)
                value = value * _premier[2];

            var CadreMoy = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[3]);
            if (CadreMoy)
                value = value * _premier[3];


            var Emp = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[4]);
            if (Emp)
                value = value * _premier[5];



            var PetitPatro = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[5]);
            if (PetitPatro)
                value = value * _premier[11];

            var Chom = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[6]);
            if (Chom)
                value = value * _premier[4];




            var Fof = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[7]);
            if (Fof)
                value = value * _premier[7];


            var Etud = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[8]);
            if (Etud)
                value = value * _premier[6];

            var Retret = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[9]);
            if (Retret)
                value = value * _premier[13];

            var Passion = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[10]);
            if (Passion)
                value = value * _premier[10];

            var Autre = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[11]);
            if (Autre)
                value = value * _premier[9];

            /***************Situation Familiale*************************/




            /*if (Filtre.StatutFamiliales.Any())
            {
                var listeSitFam = Filtre.StatutFamiliales.Select(SitFam => (int) SitFam).ToList();
                sigElu = sigElu.Where(e => listeSitFam.Contains((int)e.Statutfamilial)).ToList();

            }*/



            var Chef = FiltreFactory.DesassembleFiltre(Filtre.StatutFamiliales, _premier[0]);
            if (!Chef)
                sigElu = sigElu.Where(e => e.Statutfamilial != StatutFamiliale.ChefFamille).ToList();

            var maitr = FiltreFactory.DesassembleFiltre(Filtre.StatutFamiliales, _premier[1]);
            if (!maitr)
                sigElu = sigElu.Where(e => e.Statutfamilial != StatutFamiliale.MaitresseMaison).ToList();

            var enfant = FiltreFactory.DesassembleFiltre(Filtre.StatutFamiliales, _premier[2]);
            if (!enfant)
                sigElu = sigElu.Where(e => e.Statutfamilial != StatutFamiliale.EnfantChefFamille).ToList();

            var autrStat = FiltreFactory.DesassembleFiltre(Filtre.StatutFamiliales, _premier[3]);
            if (!autrStat)
                sigElu = sigElu.Where(e => e.Statutfamilial != StatutFamiliale.Autre).ToList();





            /***************Genre*************************/
            /*if (Filtre.Genres.Any())
            {
                var listeGenre = Filtre.Genres.Select(genre => (int) genre).ToList();
                sigElu = sigElu.Where(e => listeGenre.Contains((int)e.Genre)).ToList();
            }*/

            var Homme = FiltreFactory.DesassembleFiltre(Filtre.Genres, _premier[0]);
            if (Homme)
                value = value * _premier[0];

            var Femme = FiltreFactory.DesassembleFiltre(Filtre.Genres, _premier[1]);
            if (Femme)
                value = value * _premier[1];




            /***************NiveauxInstructions*************************/
            /*if (Filtre.NiveauxInstructions.Any())
            {
                var niveauxInstructions = Filtre.NiveauxInstructions.Select(instance => (int) instance).ToList();
                sigElu = sigElu.Where(e => niveauxInstructions.Contains((int)e.Niveau)).ToList();
            }*/
            var Sans = FiltreFactory.DesassembleFiltre(Filtre.NiveauxInstructions, _premier[0]);
            if (Sans)
                value = value * _premier[27];

            var Analph = FiltreFactory.DesassembleFiltre(Filtre.NiveauxInstructions, _premier[1]);
            if (Analph)
                value = value * _premier[26];

            var prim = FiltreFactory.DesassembleFiltre(Filtre.NiveauxInstructions, _premier[2]);
            if (prim)
                value = value * _premier[24];

            var Moyen = FiltreFactory.DesassembleFiltre(Filtre.NiveauxInstructions, _premier[3]);
            if (Moyen)
                value = value * _premier[23];


            var Second = FiltreFactory.DesassembleFiltre(Filtre.NiveauxInstructions, _premier[4]);
            if (Second)
                value = value * _premier[25];


            var univ = FiltreFactory.DesassembleFiltre(Filtre.NiveauxInstructions, _premier[5]);
            if (univ)
                value = value * _premier[28];

            /***************RevenueTotalFoyers*************************/
            /*if (Filtre.NiveauxInstructions.Any())
            {
                var RevenueTotalFoyers = Filtre.RevenueTotalFoyers.Select(instance => (int) instance).ToList();
                sigElu = sigElu.Where(e => RevenueTotalFoyers.Contains((int)e.RevenueTotalFoyer)).ToList();
            }*/

            var Mo12 = FiltreFactory.DesassembleFiltre(Filtre.RevenueTotalFoyers, _premier[0]);
            if (Mo12)
                value = value * _premier[18];


            var Entre12 = FiltreFactory.DesassembleFiltre(Filtre.RevenueTotalFoyers, _premier[1]);
            if (Entre12)
                value = value * _premier[14];

            var Entre20 = FiltreFactory.DesassembleFiltre(Filtre.RevenueTotalFoyers, _premier[2]);
            if (Entre20)
                value = value * _premier[15];

            var Entre35 = FiltreFactory.DesassembleFiltre(Filtre.RevenueTotalFoyers, _premier[3]);
            if (Entre35)
                value = value * _premier[14];

            var Entre50 = FiltreFactory.DesassembleFiltre(Filtre.RevenueTotalFoyers, _premier[4]);
            if (Entre50)
                value = value * _premier[15];

            var Entre90 = FiltreFactory.DesassembleFiltre(Filtre.RevenueTotalFoyers, _premier[5]);
            if (Entre90)
                value = value * _premier[16];

            var Entre150 = FiltreFactory.DesassembleFiltre(Filtre.RevenueTotalFoyers, _premier[6]);
            if (Entre150)
                value = value * _premier[17];








            return value;


        }

        public int GetFiltreSecondaire()
        {
            int value = 1;
            if (this.Filtre == null) return 1;


            /***************Situation Familiale*************************/






            var Chef = FiltreFactory.DesassembleFiltre(Filtre.StatutFamiliales, _premier[0]);
            if (Chef)
                value = value * _premier[1];

            var maitr = FiltreFactory.DesassembleFiltre(Filtre.StatutFamiliales, _premier[1]);
            if (maitr)
                value = value * _premier[3];

            var enfant = FiltreFactory.DesassembleFiltre(Filtre.StatutFamiliales, _premier[2]);
            if (enfant)
                value = value * _premier[2];

            var autrStat = FiltreFactory.DesassembleFiltre(Filtre.StatutFamiliales, _premier[3]);
            if (autrStat)
                value = value * _premier[0];



            /***************Habitats*************************/
            /*if (Filtre.Habitats.Any())
            {
                var listeHabitats = Filtre.Habitats.Select(habitat => (int) habitat).ToList();
                sigElu = sigElu.Where(e => listeHabitats.Contains((int)e.Habitat)).ToList();
            }*/

            var prop = FiltreFactory.DesassembleFiltre(Filtre.Habitats, _premier[0]);
            if (prop)
                value = value * _premier[14];

            var loc = FiltreFactory.DesassembleFiltre(Filtre.Habitats, _premier[1]);
            if (loc)
                value = value * _premier[13];

            /***************NbChambres*************************/

            /*
            if (Filtre.NbChambres.Any())
            {
                var nbChambres = Filtre.NbChambres.Select(NbChambre => (int) NbChambre).ToList();
                sigElu = sigElu.Where(e => nbChambres.Contains((int)e.NbPiece)).ToList();
            }*/


            var Chambr1 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[0]);
            if (Chambr1)
                value = value * _premier[8];

            var Chambr2 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[1]);
            if (Chambr2)
                value = value * _premier[5]; ;

            var Chambr3 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[2]);
            if (Chambr3)
                value = value * _premier[7];

            var Chambr4 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[3]);
            if (Chambr4)
                value = value * _premier[6];

            var Chambr5 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[4]);
            if (Chambr5)
                value = value * _premier[4];


            /***************NbVoitures*************************/

            /*if (Filtre.NbVoitures.Any())
            {
                var NbVoitures = Filtre.NbVoitures.Select(instance => (int) instance).ToList();
                sigElu = sigElu.Where(e => NbVoitures.Contains((int)e.NbVoiture)).ToList();
            }*/

            var Voiture0 = FiltreFactory.DesassembleFiltre(Filtre.NbVoitures, _premier[0]);
            if (Voiture0)
                value = value * _premier[9];

            var Voiture1 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[0]);
            if (Voiture1)
                value = value * _premier[10]; ;

            var Voiture2 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[0]);
            if (Voiture2)
                value = value * _premier[11];

            var Voiture3 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[0]);
            if (Voiture3)
                value = value * _premier[12];





            /***************SituationMatrimonials*************************/
            /*if (Filtre.SituationMatrimonials.Any())
            {
                var listeSituationMatrimonials = Filtre.SituationMatrimonials.Select(habitat => (int)habitat).ToList();
                sigElu = sigElu.Where(e => listeSituationMatrimonials.Contains((int)e.Situationmatrimoniale)).ToList();
            }
            */


            /***************TailleFoyers********z*****************/
            /*if (Filtre.TailleFoyers.Any())
            {
                var listeTailleFoyers = Filtre.TailleFoyers.Select(habitat => (int) habitat).ToList();
                sigElu = sigElu.Where(e => listeTailleFoyers.Contains((int)e.TailleFoyer)).ToList();
            }*/



            /***************TypeHabitat********z*****************/
            /*if (Filtre.TypeHabitations.Any())
            {
                var listeTypeHabitations = Filtre.TypeHabitations.Select(instance => (int) instance).ToList();
                sigElu = sigElu.Where(e => listeTypeHabitations.Contains((int)e.TypeHabitat)).ToList();
            }*/

            var toile = FiltreFactory.DesassembleFiltre(Filtre.TypeHabitations, _premier[0]);
            if (toile)
                value = value * _premier[19];

            var tradit = FiltreFactory.DesassembleFiltre(Filtre.TypeHabitations, _premier[1]);
            if (tradit)
                value = value * _premier[20];

            var appart = FiltreFactory.DesassembleFiltre(Filtre.TypeHabitations, _premier[2]);
            if (appart)
                value = value * _premier[16]; ;

            var appartsta = FiltreFactory.DesassembleFiltre(Filtre.TypeHabitations, _premier[3]);
            if (appartsta)
                value = value * _premier[17];


            var villajum = FiltreFactory.DesassembleFiltre(Filtre.TypeHabitations, _premier[5]);
            if (villajum)
                value = value * _premier[22];

            var villaindep = FiltreFactory.DesassembleFiltre(Filtre.TypeHabitations, _premier[6]);
            if (!villaindep)
                value = value * _premier[21];


            return value;


        }


        public IEnumerable<ISignalitique> GetSignalitique()
        {
            if (this.Filtre == null) return this.Signalitiques;
            List<ISignalitique> sigElu = this.Vague.Signalitique;
            
            /***************CSE*************************/
            /*if (Filtre.CSEs.Any())
            {
                List<int> listeCse = Filtre.CSEs.Select(Cse => (int) Cse).ToList();
                sigElu = sigElu.Where(e => listeCse.Contains((int)e.CSE)).ToList();
            }*/


            var Class_a = FiltreFactory.DesassembleFiltre(Filtre.CSEs, _premier[0]);
            if(!Class_a)
                sigElu = sigElu.Where(e => e.CSE != CSE.A_ClasseAisee).ToList();

            var Class_b = FiltreFactory.DesassembleFiltre(Filtre.CSEs, _premier[1]);
            if(!Class_b)
                sigElu = sigElu.Where(e => e.CSE !=CSE.B_ClasseMoyenneSuperieur).ToList();

            var Class_c = FiltreFactory.DesassembleFiltre(Filtre.CSEs, _premier[2]);
            if (!Class_c)
                sigElu = sigElu.Where(e => e.CSE != CSE.C_ClasseMoyenneInferieur).ToList();

            var Class_d = FiltreFactory.DesassembleFiltre(Filtre.CSEs, _premier[3]);
            if (!Class_d)
            sigElu = sigElu.Where(e => e.CSE != CSE.D_ClasseDemunie).ToList();


            /***************CSP*************************/
            /*
            if (Filtre.CSPs.Any())
            {
                var listeCsp = Filtre.CSPs.Select(Csp => (int) Csp).ToList();
                sigElu = sigElu.Where(e => listeCsp.Contains((int)e.CSP)).ToList();
            }*/


            var HautFonc = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[0]);
            if (!HautFonc)
                sigElu = sigElu.Where(e => e.CSP != CSP.HautFonctionnaireCadreSuperieurEtat).ToList();

            var ProfLibe = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[1]);
            if (!ProfLibe)
                sigElu = sigElu.Where(e => e.CSP != CSP.ProfessionLiberal).ToList();

            var Cadre = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[2]);
            if (!Cadre)
                sigElu = sigElu.Where(e => e.CSP != CSP.Cadre).ToList();

            var CadreMoy = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[3]);
            if (!CadreMoy)
                sigElu = sigElu.Where(e => e.CSP != CSP.CadreMoyen).ToList();



            var Emp = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[4]);
            if (!Emp)
                sigElu = sigElu.Where(e => e.CSP != CSP.Employee).ToList();

            var PetitPatro = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[5]);
            if (!PetitPatro)
                sigElu = sigElu.Where(e => e.CSP != CSP.PetitPatron).ToList();

            var Chom = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[6]);
            if (!Chom)
                sigElu = sigElu.Where(e => e.CSP != CSP.Chomeur).ToList();

            var Fof = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[7]);
            if (!Fof)
                sigElu = sigElu.Where(e => e.CSP != CSP.FemmeFoyer).ToList();


            var Etud = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[8]);
            if (!Etud)
                sigElu = sigElu.Where(e => e.CSP != CSP.Etudiant).ToList();

            var Retret = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[9]);
            if (!Retret)
                sigElu = sigElu.Where(e => e.CSP != CSP.Retraite).ToList();

            var Passion = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[10]);
            if (!Passion)
                sigElu = sigElu.Where(e => e.CSP != CSP.Pensionne).ToList();

            var Autre = FiltreFactory.DesassembleFiltre(Filtre.CSPs, _premier[11]);
            if (!Autre)
                sigElu = sigElu.Where(e => e.CSP != CSP.Inactif).ToList();

            /***************Situation Familiale*************************/




            /*if (Filtre.StatutFamiliales.Any())
            {
                var listeSitFam = Filtre.StatutFamiliales.Select(SitFam => (int) SitFam).ToList();
                sigElu = sigElu.Where(e => listeSitFam.Contains((int)e.Statutfamilial)).ToList();

            }*/



            var Chef = FiltreFactory.DesassembleFiltre(Filtre.StatutFamiliales, _premier[0]);
            if (!Chef)
                sigElu = sigElu.Where(e => e.Statutfamilial != StatutFamiliale.ChefFamille).ToList();

            var maitr = FiltreFactory.DesassembleFiltre(Filtre.StatutFamiliales, _premier[1]);
            if (!maitr)
                sigElu = sigElu.Where(e => e.Statutfamilial != StatutFamiliale.MaitresseMaison).ToList();

            var enfant = FiltreFactory.DesassembleFiltre(Filtre.StatutFamiliales, _premier[2]);
            if (!enfant)
                sigElu = sigElu.Where(e => e.Statutfamilial != StatutFamiliale.EnfantChefFamille).ToList();

            var autrStat = FiltreFactory.DesassembleFiltre(Filtre.StatutFamiliales, _premier[3]);
            if (!CadreMoy)
                sigElu = sigElu.Where(e => e.Statutfamilial != StatutFamiliale.Autre).ToList();


            /***************Equipement*************************/
            if (Filtre.Equipements != 0)
            {
                var listeEquipement = Filtre.Equipements;

                //1 homme
                //0 femme 



                var refrigirateur = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[0]);
                sigElu = sigElu.Where(e => e.Refrigirateur = refrigirateur).ToList();


                var TVCouleur = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[1]);
                sigElu = sigElu.Where(e => e.Televisionencouleur = TVCouleur).ToList();



                var LecteurCass = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[2]);
                sigElu = sigElu.Where(e => e.Lecteurradiocassette = LecteurCass).ToList();


                var Demo = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[3]);
                sigElu = sigElu.Where(e => e.Decodeur = Demo).ToList();

                var mobile = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[4]);
                sigElu = sigElu.Where(e => e.Mobile = mobile).ToList();

                var cuisiniere = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[5]);
                sigElu = sigElu.Where(e => e.Cuisiniere = cuisiniere).ToList();


                var tel = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[6]);
                sigElu = sigElu.Where(e => e.Telephone = tel).ToList();


                var fourMicro = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[7]);
                sigElu = sigElu.Where(e => e.Fourmicroonde = fourMicro).ToList();


                var chainesStreo = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[8]);
                sigElu = sigElu.Where(e => e.Chainestereo = chainesStreo).ToList();


                var laveLinge = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[9]);
                sigElu = sigElu.Where(e => e.LaveLinge = laveLinge).ToList();


                var LecteurDVD = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[10]);
                sigElu = sigElu.Where(e => e.LecteurDVD = LecteurDVD).ToList();


                var Aspirateur = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[11]);
                sigElu = sigElu.Where(e => e.Aspirateur = Aspirateur).ToList();


                var PCSansConnexion = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[12]);
                sigElu = sigElu.Where(e => e.Pcsansconnexion = PCSansConnexion).ToList();




                var Congelateur = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[13]);
                sigElu = sigElu.Where(e => e.Congelateur = Congelateur).ToList();




                var AppareilPhoto = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[14]);
                sigElu = sigElu.Where(e => e.AppareilPhotoNumerique = AppareilPhoto).ToList();




                var Magnetoscope = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[15]);
                sigElu = sigElu.Where(e => e.Magnetoscope = Magnetoscope).ToList();




                var LecteurCD = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[16]);
                sigElu = sigElu.Where(e => e.LecteurCD = LecteurCD).ToList();




                var Climatiseur = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[17]);
                sigElu = sigElu.Where(e => e.Climatiseur = Climatiseur).ToList();




                var CameraVideo = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[18]);
                sigElu = sigElu.Where(e => e.Camescope = CameraVideo).ToList();




                var ConsoleJeux = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[19]);
                sigElu = sigElu.Where(e => e.Console = ConsoleJeux).ToList();





                var LaveVaisselle = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[20]);
                sigElu = sigElu.Where(e => e.LaveVaissele = LaveVaisselle).ToList();





                var SecheLinge = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[21]);
                sigElu = sigElu.Where(e => e.SecheLinge = SecheLinge).ToList();


                var PCAvecConnexion = FiltreFactory.DesassembleFiltre(listeEquipement, _premier[22]);
                sigElu = sigElu.Where(e => e.PCConnexion = PCAvecConnexion).ToList();
            }


            /***************Genre*************************/
            /*if (Filtre.Genres.Any())
            {
                var listeGenre = Filtre.Genres.Select(genre => (int) genre).ToList();
                sigElu = sigElu.Where(e => listeGenre.Contains((int)e.Genre)).ToList();
            }*/

            var Homme = FiltreFactory.DesassembleFiltre(Filtre.Genres, _premier[0]);
            if (!Homme)
                sigElu = sigElu.Where(e => e.Genre != Genre.Homme).ToList();

            var Femme = FiltreFactory.DesassembleFiltre(Filtre.Genres, _premier[1]);
            if (!Femme)
                sigElu = sigElu.Where(e => e.Genre != Genre.Femme).ToList();

            /***************Habitats*************************/
            /*if (Filtre.Habitats.Any())
            {
                var listeHabitats = Filtre.Habitats.Select(habitat => (int) habitat).ToList();
                sigElu = sigElu.Where(e => listeHabitats.Contains((int)e.Habitat)).ToList();
            }*/

            var prop = FiltreFactory.DesassembleFiltre(Filtre.Habitats, _premier[0]);
            if (!prop)
                sigElu = sigElu.Where(e => e.Habitat != Habitat.Proprietaire).ToList();

            var loc = FiltreFactory.DesassembleFiltre(Filtre.Habitats, _premier[1]);
            if (!loc)
                sigElu = sigElu.Where(e => e.Habitat != Habitat.Locataire).ToList();

            /***************NbChambres*************************/

            /*
            if (Filtre.NbChambres.Any())
            {
                var nbChambres = Filtre.NbChambres.Select(NbChambre => (int) NbChambre).ToList();
                sigElu = sigElu.Where(e => nbChambres.Contains((int)e.NbPiece)).ToList();
            }*/


            var Chambr1= FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[0]);
            if (!Chambr1)
                sigElu = sigElu.Where(e => e.NbPiece != NbChambre.UneCahmbre).ToList();

            var Chambr2 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[1]);
            if (!Chambr2)
                sigElu = sigElu.Where(e => e.NbPiece != NbChambre.DeuxChambre).ToList();

            var Chambr3 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[2]);
            if (!Chambr3)
                sigElu = sigElu.Where(e => e.NbPiece != NbChambre.TroisChambre).ToList();

            var Chambr4 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[3]);
            if (!Chambr4)
                sigElu = sigElu.Where(e => e.NbPiece != NbChambre.QuatreChambre).ToList();

            var Chambr5 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[4]);
            if (!Chambr5)
                sigElu = sigElu.Where(e => e.NbPiece != NbChambre.CinqChambreOuPlus).ToList();


            /***************NbVoitures*************************/

            /*if (Filtre.NbVoitures.Any())
            {
                var NbVoitures = Filtre.NbVoitures.Select(instance => (int) instance).ToList();
                sigElu = sigElu.Where(e => NbVoitures.Contains((int)e.NbVoiture)).ToList();
            }*/

            var Voiture0 = FiltreFactory.DesassembleFiltre(Filtre.NbVoitures, _premier[0]);
            if (!Voiture0)
                sigElu = sigElu.Where(e => e.NbVoiture != NbVoiture.Aucune).ToList();

            var Voiture1 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[0]);
            if (!Voiture1)
                sigElu = sigElu.Where(e => e.NbVoiture != NbVoiture.UneVoiture).ToList();

            var Voiture2 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[0]);
            if (!Voiture2)
                sigElu = sigElu.Where(e => e.NbVoiture != NbVoiture.DeuxVoiture).ToList();

            var Voiture3 = FiltreFactory.DesassembleFiltre(Filtre.NbChambres, _premier[0]);
            if (!Voiture3)
                sigElu = sigElu.Where(e => e.NbVoiture != NbVoiture.TroisVoiturePlus).ToList();


            /***************NiveauxInstructions*************************/
            /*if (Filtre.NiveauxInstructions.Any())
            {
                var niveauxInstructions = Filtre.NiveauxInstructions.Select(instance => (int) instance).ToList();
                sigElu = sigElu.Where(e => niveauxInstructions.Contains((int)e.Niveau)).ToList();
            }*/
            var Sans = FiltreFactory.DesassembleFiltre(Filtre.NiveauxInstructions, _premier[0]);
            if (!Sans)
                sigElu = sigElu.Where(e => e.Niveau != NiveauInstruction.SansInstructionAnalphabet).ToList();

            var Analph = FiltreFactory.DesassembleFiltre(Filtre.NiveauxInstructions, _premier[1]);
            if (!Analph)
                sigElu = sigElu.Where(e => e.Niveau != NiveauInstruction.SansInstructionMaisSaitLireEtEcrire).ToList();

            var prim = FiltreFactory.DesassembleFiltre(Filtre.NiveauxInstructions, _premier[2]);
            if (!prim)
                sigElu = sigElu.Where(e => e.Niveau != NiveauInstruction.NiveauxPrimaire).ToList();

            var Moyen = FiltreFactory.DesassembleFiltre(Filtre.NiveauxInstructions, _premier[3]);
            if (!Moyen)
                sigElu = sigElu.Where(e => e.Niveau != NiveauInstruction.NiveauxMoyen).ToList();


            var Second = FiltreFactory.DesassembleFiltre(Filtre.NiveauxInstructions, _premier[4]);
            if (!Second)
                sigElu = sigElu.Where(e => e.Niveau != NiveauInstruction.NiveauxSecondaire).ToList();

            
            var univ = FiltreFactory.DesassembleFiltre(Filtre.NiveauxInstructions, _premier[5]);
            if (!univ)
                sigElu = sigElu.Where(e => e.Niveau != NiveauInstruction.Universitaire).ToList();
            /***************RevenueTotalFoyers*************************/
            /*if (Filtre.NiveauxInstructions.Any())
            {
                var RevenueTotalFoyers = Filtre.RevenueTotalFoyers.Select(instance => (int) instance).ToList();
                sigElu = sigElu.Where(e => RevenueTotalFoyers.Contains((int)e.RevenueTotalFoyer)).ToList();
            }*/

            var Mo12 = FiltreFactory.DesassembleFiltre(Filtre.RevenueTotalFoyers, _premier[0]);
            if (!Mo12)
                sigElu = sigElu.Where(e => e.RevenueTotalFoyer != RevenuTotalFoyer.Moins12000).ToList();


            var Entre12 = FiltreFactory.DesassembleFiltre(Filtre.RevenueTotalFoyers, _premier[1]);
            if (!Entre12)
                sigElu = sigElu.Where(e => e.RevenueTotalFoyer != RevenuTotalFoyer.Entre12000et19999).ToList();

            var Entre20 = FiltreFactory.DesassembleFiltre(Filtre.RevenueTotalFoyers, _premier[2]);
            if (!Entre20)
                sigElu = sigElu.Where(e => e.RevenueTotalFoyer != RevenuTotalFoyer.Entre20000et34999).ToList();

            var Entre35 = FiltreFactory.DesassembleFiltre(Filtre.RevenueTotalFoyers, _premier[3]);
            if (!Entre35)
                sigElu = sigElu.Where(e => e.RevenueTotalFoyer != RevenuTotalFoyer.Entre35000et49000).ToList();

            var Entre50 = FiltreFactory.DesassembleFiltre(Filtre.RevenueTotalFoyers, _premier[4]);
            if (!Entre50)
                sigElu = sigElu.Where(e => e.RevenueTotalFoyer != RevenuTotalFoyer.Entre50000et89000).ToList();

            var Entre90 = FiltreFactory.DesassembleFiltre(Filtre.RevenueTotalFoyers, _premier[5]);
            if (!Entre90)
                sigElu = sigElu.Where(e => e.RevenueTotalFoyer != RevenuTotalFoyer.Entre90000et120000).ToList();

            var Entre150 = FiltreFactory.DesassembleFiltre(Filtre.RevenueTotalFoyers, _premier[6]);
            if (!Entre150)
                sigElu = sigElu.Where(e => e.RevenueTotalFoyer != RevenuTotalFoyer.PlusDe150000).ToList();

            /***************Salaire*************************/
           /* var Salaires = Filtre.Salaires.Select(instance => (int)instance).ToList();
            sigElu = sigElu.Where(e => Salaires.Contains(e.));*/
            //TODO : salaire n'existe pas encore











            /***************SituationMatrimonials*************************/
            /*if (Filtre.SituationMatrimonials.Any())
            {
                var listeSituationMatrimonials = Filtre.SituationMatrimonials.Select(habitat => (int)habitat).ToList();
                sigElu = sigElu.Where(e => listeSituationMatrimonials.Contains((int)e.Situationmatrimoniale)).ToList();
            }
            */
            var Celib = FiltreFactory.DesassembleFiltre(Filtre.SituationMatrimonials, _premier[0]);
            if (!Celib)
                sigElu = sigElu.Where(e => e.Situationmatrimoniale != SituationMatrimonial.Celibataire).ToList();


            var marieSans = FiltreFactory.DesassembleFiltre(Filtre.SituationMatrimonials, _premier[1]);
            if (!marieSans)
                sigElu = sigElu.Where(e => e.Situationmatrimoniale != SituationMatrimonial.MarieSansEnfant).ToList();

            var marie1enfant = FiltreFactory.DesassembleFiltre(Filtre.SituationMatrimonials, _premier[2]);
            if (!marie1enfant)
                sigElu = sigElu.Where(e => e.Situationmatrimoniale != SituationMatrimonial.MarieAvecEnfantMineur).ToList();


            var marie1enfantmaj = FiltreFactory.DesassembleFiltre(Filtre.SituationMatrimonials, _premier[3]);
            if (!marie1enfantmaj)
                sigElu = sigElu.Where(e => e.Situationmatrimoniale != SituationMatrimonial.MarieAvecEnfantMajeur).ToList();


            var marie1enfantminmaj = FiltreFactory.DesassembleFiltre(Filtre.SituationMatrimonials, _premier[4]);
            if (!marie1enfantminmaj)
                sigElu = sigElu.Where(e => e.Situationmatrimoniale != SituationMatrimonial.MarieAvecEnfantMineurMajeur).ToList();


            var div = FiltreFactory.DesassembleFiltre(Filtre.SituationMatrimonials, _premier[5]);
            if (!div)
                sigElu = sigElu.Where(e => e.Situationmatrimoniale != SituationMatrimonial.Divorce).ToList();

        

            /***************TailleFoyers********z*****************/
            /*if (Filtre.TailleFoyers.Any())
            {
                var listeTailleFoyers = Filtre.TailleFoyers.Select(habitat => (int) habitat).ToList();
                sigElu = sigElu.Where(e => listeTailleFoyers.Contains((int)e.TailleFoyer)).ToList();
            }*/

          

            /***************TypeHabitat********z*****************/
            /*if (Filtre.TypeHabitations.Any())
            {
                var listeTypeHabitations = Filtre.TypeHabitations.Select(instance => (int) instance).ToList();
                sigElu = sigElu.Where(e => listeTypeHabitations.Contains((int)e.TypeHabitat)).ToList();
            }*/

            var toile = FiltreFactory.DesassembleFiltre(Filtre.TypeHabitations, _premier[0]);
            if (!toile)
                sigElu = sigElu.Where(e => e.TypeHabitat != TypeHabitation.MaisonToile).ToList();

            var tradit = FiltreFactory.DesassembleFiltre(Filtre.TypeHabitations, _premier[1]);
            if (!tradit)
                sigElu = sigElu.Where(e => e.TypeHabitat != TypeHabitation.MaisonTraditionnel).ToList();

            var appart = FiltreFactory.DesassembleFiltre(Filtre.TypeHabitations, _premier[2]);
            if (!appart)
                sigElu = sigElu.Where(e => e.TypeHabitat != TypeHabitation.AppartementImmeuble).ToList();

            var appartsta = FiltreFactory.DesassembleFiltre(Filtre.TypeHabitations, _premier[3]);
            if (!appartsta)
                sigElu = sigElu.Where(e => e.TypeHabitat != TypeHabitation.AppartementImmeubleStanding).ToList();

            var villajum= FiltreFactory.DesassembleFiltre(Filtre.TypeHabitations, _premier[5]);
            if (!villajum)
                sigElu = sigElu.Where(e => e.TypeHabitat != TypeHabitation.VillaJumeleTerrain).ToList();

            var villaindep = FiltreFactory.DesassembleFiltre(Filtre.TypeHabitations, _premier[6]);
            if (!villaindep)
                sigElu = sigElu.Where(e => e.TypeHabitat != TypeHabitation.VillaIndependanteJardin).ToList();

            /***************Age********z*****************/
            var agemin = 0;
            var agemax = 100;
            if (Filtre.ageMin != 0) agemin = Filtre.ageMin;
            if (Filtre.ageMax != 0) agemax = Filtre.ageMax;
            sigElu = sigElu.Where(e => e.Age > agemin && e.Age < agemax).ToList();




            return sigElu;


        }


        public float GetCov(IRepositoryVague<Vague,Guid> repositoryVague)
        {
            var planTvs = this.PlanTvs;
           
                var criterionTvSupport = new Criterion("planTv", planTvs, CriteriaOperator.Equal);
                var criterionRdSupport = new Criterion("planRd", PlanRadios, CriteriaOperator.Equal);
                var criterionPrSupport = new Criterion("planPr", PlanPresses, CriteriaOperator.Equal);
                var criterionSignlalitiques = new Criterion("compaign",this,CriteriaOperator.Equal);
                var QueryTv = new Query();
                QueryTv.Add(criterionTvSupport);
                QueryTv.Add(criterionRdSupport);
                QueryTv.Add(criterionPrSupport);
                QueryTv.Add(criterionSignlalitiques);
                repositoryVague.GetAudienceTv(QueryTv,Vague);
            
            //TODO: verifier que les plan ne sont pas egale a null 
            return 50;
        }

        public float GetFreq()
        {
            return 0;
        }


      
    }
}
